/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * DatosEstudioCardiologicoPanel.java
 *
 * Created on 27/01/2011, 13:03:42
 */

package presentacion.tratamiento_y_practica;

import hibernate.objeto.BalanceHidroelectrolitico;
import hibernate.objeto.CuidadoDeInternacion;
import hibernate.objeto.CuidadoYMedicion;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JDialog;
import javax.swing.JPanel;
import logica.BalanceHidroelectroliticoLogica;
import logica.CapaLogica;
import logica.CuidadoDeInternacionLogica;
import logica.CuidadoYMedicionLogica;
import presentacion.CapaPresentacion;
import presentacion.utilidad.maquetado.Fuente;
import presentacion.utilidad.maquetado.InformeError;

/**
 *
 * @author Gonzalo
 */
public class DatosCuidadosDeInternacionPanel extends javax.swing.JPanel {

    /** Creates new form DatosEstudioCardiologicoPanel */
    public DatosCuidadosDeInternacionPanel(CuidadoDeInternacion cuidadoDeInternacion) {
        initComponents();

        this.cuidadoDeInternacionAVisualizar =
                cuidadoDeInternacion;

        setearEventosQueCapturanTeclaEnterYEscape();

        if (this.cuidadoDeInternacionAVisualizar != null) {
            personalizarJDialog();
        }
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        panelCuidadosInternacion = new javax.swing.JPanel();
        textoCuidadosInternacion = new javax.swing.JLabel();
        tipoCuidadosInternacion = new javax.swing.JComboBox();
        panelCuidadosInternacionInternoScrollPane = new javax.swing.JScrollPane();
        panelCuidadosInternacionInterno = new javax.swing.JPanel();

        panelCuidadosInternacion.setPreferredSize(new java.awt.Dimension(417, 495));
        panelCuidadosInternacion.setRequestFocusEnabled(false);
        panelCuidadosInternacion.setVerifyInputWhenFocusTarget(false);

        textoCuidadosInternacion.setFont(Fuente.FUENTE_LABEL);
        textoCuidadosInternacion.setText("Tipo de cuidado");
        textoCuidadosInternacion.setPreferredSize(new java.awt.Dimension(138, 20));

        tipoCuidadosInternacion.setFont(Fuente.FUENTE_TEXTFIELD);
        tipoCuidadosInternacion.setModel(CapaPresentacion.getListaDeTipoDeInternacionTratamientoYPractica());
        tipoCuidadosInternacion.setPreferredSize(new java.awt.Dimension(217, 20));
        tipoCuidadosInternacion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tipoCuidadosInternacionActionPerformed(evt);
            }
        });

        panelCuidadosInternacionInternoScrollPane.setBorder(null);
        panelCuidadosInternacionInternoScrollPane.setPreferredSize(new java.awt.Dimension(970, 342));

        panelCuidadosInternacionInterno.setMaximumSize(new java.awt.Dimension(374, 382));
        panelCuidadosInternacionInterno.setPreferredSize(new java.awt.Dimension(374, 200));
        panelCuidadosInternacionInterno.setLayout(new javax.swing.BoxLayout(panelCuidadosInternacionInterno, javax.swing.BoxLayout.LINE_AXIS));
        panelCuidadosInternacionInternoScrollPane.setViewportView(panelCuidadosInternacionInterno);

        javax.swing.GroupLayout panelCuidadosInternacionLayout = new javax.swing.GroupLayout(panelCuidadosInternacion);
        panelCuidadosInternacion.setLayout(panelCuidadosInternacionLayout);
        panelCuidadosInternacionLayout.setHorizontalGroup(
            panelCuidadosInternacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelCuidadosInternacionLayout.createSequentialGroup()
                .addGroup(panelCuidadosInternacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelCuidadosInternacionLayout.createSequentialGroup()
                        .addComponent(textoCuidadosInternacion, javax.swing.GroupLayout.PREFERRED_SIZE, 93, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(tipoCuidadosInternacion, javax.swing.GroupLayout.PREFERRED_SIZE, 175, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(panelCuidadosInternacionInternoScrollPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );
        panelCuidadosInternacionLayout.setVerticalGroup(
            panelCuidadosInternacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelCuidadosInternacionLayout.createSequentialGroup()
                .addGroup(panelCuidadosInternacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(textoCuidadosInternacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(tipoCuidadosInternacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(11, 11, 11)
                .addComponent(panelCuidadosInternacionInternoScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(panelCuidadosInternacion, javax.swing.GroupLayout.DEFAULT_SIZE, 1014, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(panelCuidadosInternacion, javax.swing.GroupLayout.DEFAULT_SIZE, 384, Short.MAX_VALUE)
        );
    }// </editor-fold>//GEN-END:initComponents

    private void tipoCuidadosInternacionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tipoCuidadosInternacionActionPerformed
        guardaPanel();
        eliminarPanel();
        cargaPanel();
}//GEN-LAST:event_tipoCuidadosInternacionActionPerformed

    /**
     * Carga el panel con el tipo de estudio seleccionado.
     */
    private void cargaPanel() {
        //BALANCE HIDROELECTROLITICO
        if (tipoCuidadosInternacion.getSelectedItem().toString().
                equalsIgnoreCase("Balance hidroelectrolítico")) {
            DatosBalanceHidroelectrolitico datosBalanceHidroelectroliticoLocal =
                    new DatosBalanceHidroelectrolitico(null);
            if (datosBalanceHidroelectrolitico != null) {
                datosBalanceHidroelectroliticoLocal = datosBalanceHidroelectrolitico;
            }
            agregarPanel(panelCuidadosInternacionInterno,
                    datosBalanceHidroelectroliticoLocal);
        //CUIDADOS Y MEDICIONES
        } else if (tipoCuidadosInternacion.getSelectedItem().toString().
                equalsIgnoreCase("Cuidados y mediciones")) {
            DatosCuidadosYMedicionesPanel datosCuidadosYMedicionesPanelLocal =
                    new DatosCuidadosYMedicionesPanel(null);
            if (datosCuidadosYMedicionesPanel != null) {
                datosCuidadosYMedicionesPanelLocal =
                        datosCuidadosYMedicionesPanel;
            }
            agregarPanel(panelCuidadosInternacionInterno,
                    datosCuidadosYMedicionesPanelLocal);
        } 
    }

    /**
     * Al seleccionar un nuevo estudio, el panel del estudio actual que se
     * encuentra cargado se guarda en una variable local, para luego volver a
     * accederlo al volver a seleccionarlo.
     */
    private void guardaPanel() {
        int paneles = panelCuidadosInternacionInterno.getComponents().length;
        if (paneles > 0) {
            JPanel panelAGuardar = (JPanel) panelCuidadosInternacionInterno.
                    getComponents()[0];
            if (panelAGuardar instanceof DatosBalanceHidroelectrolitico) {
                datosBalanceHidroelectrolitico = (DatosBalanceHidroelectrolitico) panelAGuardar;
            } else if (panelAGuardar instanceof DatosCuidadosYMedicionesPanel) {
                datosCuidadosYMedicionesPanel = (DatosCuidadosYMedicionesPanel) panelAGuardar;
            } 
        }
    }

    /**
     * Quita el panel al seleccionar otro estudio.
     */
    private void eliminarPanel() {
        int paneles = panelCuidadosInternacionInterno.getComponents().length;
        if (paneles > 0) {
            panelCuidadosInternacionInterno.remove(
                    panelCuidadosInternacionInterno.getComponents()[0]);
            panelCuidadosInternacionInterno.revalidate();
            panelCuidadosInternacionInterno.repaint();
        }
    }

    /**
     * Agrega un panel a un panel.
     *
     * @param panelContenedor El panel que contiene al panel que se agregará
     * @param panelComponente El panel componente que se agregará
     */
    private void agregarPanel(JPanel panelContenedor, JPanel panelComponente) {
        panelContenedor.add(panelComponente);
        panelContenedor.revalidate();
        panelContenedor.repaint();
    }

    /**
     * Realiza la validación de los datos
     *
     * @return true si esta listo para cargarse, false en caso contrario
     */
    public boolean validarCamposCuidadosInternacion() {
        int paneles = panelCuidadosInternacionInterno.getComponents().length;
        if (paneles > 0) {
            textoCuidadosInternacion.setForeground(Fuente.COLOR_NORMAL);
            textoCuidadosInternacion.setToolTipText(null);
            JPanel panelAValidar = (JPanel) panelCuidadosInternacionInterno.
                    getComponents()[0];
            if (tipoCuidadosInternacion.getSelectedItem().toString().
                    equalsIgnoreCase("Balance hidroelectrolítico")) {
                return ((DatosBalanceHidroelectrolitico) panelAValidar).
                        validarCampos();
            } else if (tipoCuidadosInternacion.getSelectedItem().toString().
                    equalsIgnoreCase("cuidados y mediciones")) {
                return ((DatosCuidadosYMedicionesPanel) panelAValidar).
                        validarCampos();
            } else {
                return true;
            }
        } else {
            textoCuidadosInternacion.setForeground(Fuente.COLOR_ERROR);
            textoCuidadosInternacion.setToolTipText(InformeError.
                    INFORME_ERROR_CUIDADOS_DE_INTERNACION);
            return false;
        }
    }

    /**
     * Agrega un estudio cardiológico.
     *
     * @return true si se agregó correctamente, false en caso contrario.
     */
    public boolean agregarCuidadosDeInternacion(int[] idObjetoCreado) {
            //Carga toda la información de la pantalla
            recopilarDatos();
            //Agrega el estudio cardiológico
            if ((CuidadoDeInternacionLogica.agregarCuidadoDeInternacion(
                    datosCuidadoInternacion,
                    new CuidadoDeInternacion(), idObjetoCreado))) {
                cuidadoDeInternacionACargar = CuidadoDeInternacionLogica.
                        getCuidadoDeInternacionPorId(idObjetoCreado[0]);
                return setearBalanceHidroelectroliticoOCuidadoYMedicion();
            } else {
                return false;
            }
    }

    /**
     * Si corresponde setea en el tratamiento y practica un tratamiento
     * quirúrgico o un cuidado de internación.
     */
    private boolean setearBalanceHidroelectroliticoOCuidadoYMedicion() {
        boolean retorno = true;        //Si esta seteado el campo tipo en tratamiento quirúrgico
        //Se agrega un objeto tratamiento quirúrgico y se setea a un
        //Tratamiento y práctica
        if (tipoCuidadosInternacion.getSelectedItem().toString().
                equalsIgnoreCase("balance hidroelectrolítico")) {
            int[] idBalanceHidroelectroliticoCreado =
                    new int[1];
            if (agregarBalanceHidroelectrolitico(
                    idBalanceHidroelectroliticoCreado)) {
               cuidadoDeInternacionACargar.setBalanceHidroelectrolitico(
                        BalanceHidroelectroliticoLogica.
                        getBalanceHidroelectroliticoPorId(
                        idBalanceHidroelectroliticoCreado[0]));
            } else {
                retorno = false;
            }
        } else {
            int[] idCuidadoYMedicion =
                    new int[1];
            if (agregarCuidadoYMedicion(
                    idCuidadoYMedicion)) {
               cuidadoDeInternacionACargar.setCuidadoYMedicion(
                        CuidadoYMedicionLogica.
                        getCuidadoYMedicionPorId(
                        idCuidadoYMedicion[0]));
            } else {
                retorno = false;
            }
        }
        return retorno;
    }

    /**
     * Agrega un balance hidroelectrolitico.
     *
     * @param idObjetoCreado El id del objeto que se crea
     * @return true si se agregó correctamente, false en caso contrario
     */
    private boolean agregarBalanceHidroelectrolitico(int[] idObjetoCreado) {
        JPanel panelATratar = (JPanel) panelCuidadosInternacionInterno.
                    getComponents()[0];
                return ((DatosBalanceHidroelectrolitico) panelATratar).
                        agregarBalanceHidroelectrolitico(idObjetoCreado,
                        new BalanceHidroelectrolitico());
    }

    /**
     * Agrega un balance hidroelectrolitico.
     *
     * @param idObjetoCreado El id del objeto que se crea
     * @return true si se agregó correctamente, false en caso contrario
     */
    private boolean agregarCuidadoYMedicion(int[] idObjetoCreado) {
        JPanel panelATratar = (JPanel) panelCuidadosInternacionInterno.
                    getComponents()[0];
                return ((DatosCuidadosYMedicionesPanel) panelATratar).
                        agregarCuidadoYMedicion(idObjetoCreado,
                        new CuidadoYMedicion());
    }

    /**
     * Recopila los datos para luego poder crear los objetos.
     */
    private void recopilarDatos() {
        datosCuidadoInternacion = new Object[1];
        
        datosCuidadoInternacion[CapaLogica.
                TRATAMIENTO_Y_PRACTICA_CUIDADO_DE_INTERNACION_TIPO] =
                tipoCuidadosInternacion.getSelectedItem().toString();
    }

    /**
     * Setea datos de la ventana.
     */
    public void personalizarJDialog() {
            exhibirDatosEnPantalla();
            if(CapaPresentacion.modoVisualizacion) {
                inhabilitarCampos();
            }
            personalizarJPanels();
    }

    /**
     * Permite visualizar los detalles de la evolución.
     *
     */
    private void exhibirDatosEnPantalla() {
        tipoCuidadosInternacion.getModel().setSelectedItem(
                            cuidadoDeInternacionAVisualizar.
                            getTipoCuidadoDeInternacion());
    }

    /**
     * Pone en false la propiedad enabled de todos los campos de ingreso.
     *
     */
    private void inhabilitarCampos() {
        tipoCuidadosInternacion.setEnabled(false);
    }

    /**
     * Personaliza los JPanels según el tipo de estudio.
     */
    private void personalizarJPanels() {
            if (tipoCuidadosInternacion.getSelectedItem().toString().
                    equalsIgnoreCase("Balance hidroelectrolítico")) {
                eliminarPanel();
                agregarPanel(panelCuidadosInternacionInterno,
                    new DatosBalanceHidroelectrolitico(cuidadoDeInternacionAVisualizar.
                        getBalanceHidroelectrolitico()));
            }else if (tipoCuidadosInternacion.getSelectedItem().toString().
                    equalsIgnoreCase("cuidados y mediciones")) {
                eliminarPanel();
                agregarPanel(panelCuidadosInternacionInterno,
                    new DatosCuidadosYMedicionesPanel(cuidadoDeInternacionAVisualizar.
                        getCuidadoYMedicion()));
            }
        
    }

    /**
     * Setea en cada componente del JDialog los eventos que capturarán la tecla
     * enter y escape.
     */
    private void setearEventosQueCapturanTeclaEnterYEscape() {
        //Declaración del evento a capturar
        KeyListener keyListenerEscape = new KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                if (evt.getKeyCode() == KeyEvent.VK_ESCAPE) {
                    cerrarVentana();
                }
            }
        };

        //Setear eventos
        tipoCuidadosInternacion.addKeyListener(keyListenerEscape);
    }

    private void cerrarVentana() {
        JDialog jdialog = (JDialog)
                this.getParent().getParent().getParent().getParent().
                getParent().getParent().getParent().getParent();
        jdialog.dispose();
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel panelCuidadosInternacion;
    private javax.swing.JPanel panelCuidadosInternacionInterno;
    private javax.swing.JScrollPane panelCuidadosInternacionInternoScrollPane;
    private javax.swing.JLabel textoCuidadosInternacion;
    private javax.swing.JComboBox tipoCuidadosInternacion;
    // End of variables declaration//GEN-END:variables
    private Object[] datosCuidadoInternacion;
    private DatosBalanceHidroelectrolitico datosBalanceHidroelectrolitico;
    private DatosCuidadosYMedicionesPanel datosCuidadosYMedicionesPanel;
    private CuidadoDeInternacion cuidadoDeInternacionACargar;
    private CuidadoDeInternacion cuidadoDeInternacionAVisualizar;
}
